package com.swinw.asumall.order.config;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

@Configuration
public class MyRabbitConfig {

//    @Resource
//    RabbitTemplate rabbitTemplate;

    /**
     * 定义数据序列化机制
     * @return
     */
    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }

    /**
     * 定制RabbitTemplate
     * 1、服务器接收到消息回调
     *   1、spring.rabbitmq.publisher-confirms: true  #开启发送端确认
     *   2、回调方法
     *
     * 2、消息抵达队列回调
     *   1、spring.rabbitmq.publisher-returns: true
     *      spring.rabbitmq.template.mandatory: true
     *   2、回调方法
     *
     * 3、消息接收端方法回调（保证每一个消息正确消费）
     *   1、默认是自动确认，只要消息被消费，那么服务就会自动删除消息
     *      问题：丢消息
     *      原因：在处理消息的的时候，服务器宕机，就会发生消息丢失
     *   2、spring.rabbitmq.listener.simple.acknowledge-mode: manual #消息回复模式 auto：自动确认 manual:收到确认
     *      如果设置为手动确认模式，能够保证消息不丢失，在客户端没有确认收到，服务端就不会删除消息
     *         // 签收的消息编号 是否批量操作 是否退货
 *             channel.basicNack(deliveryTag,false,false);//消息签收确认
 *             channel.basicNack(deliveryTag,false,false);//拒绝签收消息
 *             channel.basicReject(deliveryTag,false);//拒绝签收信息
     *
     * @PostConstruct 表示类加载完就调用此方法
     */
//    @PostConstruct
//    public void initRabbitTemplate(){
//        //设置消息发送回调
//        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
//            /**
//             *
//             * @param correlationData 当前消息的唯一关联数据（是消息的唯一ID）
//             * @param b 消息是否成功收到
//             * @param s 失败的原因
//             */
//            @Override
//            public void confirm(CorrelationData correlationData, boolean b, String s) {
//                System.out.println(correlationData + "==" + b + "--" + s);
//            }
//        });
//        //开启发送端消息抵达队列的确认
//        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
//            /**
//             * 发送的消息无法抵挡队列回调函数
//             * @param message 发送的消息
//             * @param i 失败状态码
//             * @param s 失败提示信息
//             * @param s1 发送消息的交换机
//             * @param s2 发送消息使用的路由建
//             */
//            @Override
//            public void returnedMessage(Message message, int i, String s, String s1, String s2) {
//                System.out.println(message + "==" + i + "--" + s + "-->" + s1 + "==>" + s2);
//            }
//        });
//    }

}
